// 倒入模块
use std::io;
use std::cmp::Ordering;// 增加比较，它拥有Less,Greater和Equal三个变体
use rand::Rng;//增加随机数字

fn main() {
    println!("Guess the number!");

    let _secret_number = rand::thread_rng().gen_range(1, 101);
    //  loop 循环，只有使用 Ctrl+C 才会退出
    loop {
        println!("Please input your guess.");
        // let 为变量 
        // foo 是不可变的
        let foo = 5; 
        //如果foo 没有被使用，build 阶段会报错
        println!("foo: {}", foo);
        // mut 为可变 guess 是可变的
        // ::表明 new 是 String的一个关联函数
        // 关联函数 == 静态方法
        let mut guess = String::new(); 
        // 如果没有 use std::io; 则需要加上 std:: 前缀  即 std::io::stdin()
        // & 表示引用，& mut 表示可变引用,如果没有 mut 只有 & 则为不可变引用
        io::stdin().read_line(&mut guess)
        //因为 read_line 返回 Result<T, E>，因此它需要一个 .expect() 来处理错误。如果没有，在build 时将会显示警告
            .expect("Failed to read line");

        // trim() 去除字符串首尾的空白字符,
        // parse() 将字符串转换为数字
        // i32 是 32位整型，u32 是无符号整型，i64 是64位整型
        // match 是 Rust 的模式匹配，它将 guess 转换为 u32 类型，如果转换失败，则continue 继续下一轮循环。   
        let guess: u32 = match guess.trim().parse(){
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);
        // match 由 多个 arms（分支）组成，每个分支都处理一种情况。 arms 可以是模式，模式用来解构变量，并检查其是否与给定的值匹配。
        // guess.cmp (&secret_number) 返回 Ordering 类型，这个类型有三个值：Less，Greater，Equal, 因此，match 可以用来比较 guess 和 secret_number。
        match guess.cmp(&_secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                // 当win的时候退出循环check
                break;
            },
        }
    }
}